package cn.iocoder.yudao.module.tms.service.accountperiodtodo;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.tms.controller.admin.accountperiodtodo.vo.AccountPeriodTodoPageReqVO;
import cn.iocoder.yudao.module.tms.controller.admin.accountperiodtodo.vo.AccountPeriodTodoRespVO;
import cn.iocoder.yudao.module.tms.controller.admin.accountperiodtodo.vo.AccountPeriodTodoStatisticsRespVO;
import cn.iocoder.yudao.module.tms.dal.dataobject.companyaccountperiod.CompanyAccountPeriodDO;

import java.util.List;

/**
 * 账期待办事项 Service 接口
 *
 * @author 芋道源码
 */
public interface AccountPeriodTodoService {

    /**
     * 检查并生成账期相关的待办事项
     * 
     * @param accountPeriod 账期信息
     */
    void checkAndGenerateTodos(CompanyAccountPeriodDO accountPeriod);

    /**
     * 生成授信预警待办
     * 
     * @param accountPeriod 账期信息
     */
    void generateCreditAlertTodo(CompanyAccountPeriodDO accountPeriod);

    /**
     * 生成账期预警待办
     * 
     * @param accountPeriod 账期信息
     * @param remainingDays 剩余天数
     */
    void generateBillingAlertTodo(CompanyAccountPeriodDO accountPeriod, int remainingDays);

    /**
     * 生成账期逾期待办
     * 
     * @param accountPeriod 账期信息
     * @param overdueDays 逾期天数
     */
    void generateBillingOverdueTodo(CompanyAccountPeriodDO accountPeriod, int overdueDays);

    /**
     * 完成待办事项
     * 
     * @param id 待办ID
     * @param remark 完成备注
     */
    void completeTodo(Long id, String remark);

    /**
     * 取消待办事项
     * 
     * @param id 待办ID
     * @param reason 取消原因
     */
    void cancelTodo(Long id, String reason);

    /**
     * 批量完成待办事项
     * 
     * @param ids 待办ID列表
     * @param remark 完成备注
     */
    void batchCompleteTodo(List<Long> ids, String remark);

    /**
     * 获取待办事项分页
     * 
     * @param pageReqVO 分页查询参数
     * @return 分页结果
     */
    PageResult<AccountPeriodTodoRespVO> getAccountPeriodTodoPage(AccountPeriodTodoPageReqVO pageReqVO);

    /**
     * 获取待办事项详情
     * 
     * @param id 待办ID
     * @return 待办详情
     */
    AccountPeriodTodoRespVO getAccountPeriodTodo(Long id);

    /**
     * 获取待办统计
     * 
     * @return 统计数据
     */
    AccountPeriodTodoStatisticsRespVO getStatistics();

    /**
     * 获取我的待办数量
     * 
     * @return 待办数量
     */
    Integer getMyTodoCount();
}
